﻿using System;
using System.Diagnostics;
using System.Windows.Forms;
using Business.Entity.Contabil;
using Business.Entity.Contabil.Pessoa.SubClass.Usuario;
using Business.Entity.Contabil.Pessoa.SubClass.Usuario.ClassesRelacionadas;
using Business.Entity.Sistema;
using Business.Entity.Sped;
using Business.InformacoesIniciais;
using Business.Properties;
using Business.Seguranca;
using FluentNHibernate.Cfg.Db;
using NHibernate.Tool.hbm2ddl;
using Npgsql;

namespace Business.Forms
{
    public partial class FormLogin : FormDefault
    {

        public FormLogin()
        {
            InitializeComponent();

        }

        private void FormLogin_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (Utils.UsuarioAtual == null)
            {
                Process.GetCurrentProcess().Kill();
            }
        }

        private void cmdCancelar_Click(object sender, EventArgs e)
        {
            Process.GetCurrentProcess().Kill();
        }

        private void cmdOk_Click(object sender, EventArgs e)
        {
            if (usuarioTextEdit.Text.Equals(""))
            {
                MessageBox.Show("Informe o usuário.", "Atenção");
                return;
            }
            if (senhaTextEdit.Text.Equals(""))
            {
                MessageBox.Show("Informe a senha.", "Atenção");
                return;
            }

            var u = UsuarioRepository.GetUsuario(usuarioTextEdit.Text);
            var senha = senhaTextEdit.Text;
            senha = new Criptografia.CriptHash().GetHash(senha);
            if (u != null && senha.Equals(u.Senha))
            {
                Utils.UsuarioAtual = u;
                SegurancaUtils.LoadPermissoes();
                var chave = "";
                // Código que verifica a validade do terminal
                while (chave == null || chave.Equals(""))
                {
                    chave = Settings.Default.IdAplicacao.Replace(" ", "");
                    if (chave == null || chave.Equals(""))
                    {

                        MessageBox.Show("Identificador do terminal não é válida.");
                        new FormRecebeChave().ShowDialog();
                    }
                }
            }
            else
            {
                MessageBox.Show("O usuário não existe ou a senha está incorreta.", "Alerta");
                return;
            }
            Close();

        }

        private void cmdConfiguracoes_Click(object sender, EventArgs e)
        {
            new FormConfigBusiness().ShowDialog();
        }

        private void FormLogin_Load(object sender, EventArgs e)
        {
            if (Utils.UsuarioAtual != null)
            {
                Close();
            }
        }

        private void criarBancoDeDadosToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void reiniciarConfiguraçãoDoTerminalToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (var au = new FormAutenticacaoInicial())
            {
                var result = au.ShowDialog();
                if (result == DialogResult.OK)
                {
                    Utils.ResetIdAplicacao();
                    MessageBox.Show("A aplicação deve ser reiniciada.");
                    Process.GetCurrentProcess().Kill();
                }
            }
        }

        public bool AcessarTelaVenda()
        {
            return rdiTipoTelaVenda.SelectedIndex == 0;
        }

        public bool AcessarMenuFiscal()
        {
            return rdiTipoTelaVenda.SelectedIndex == 1;
        }

        public void MostraOpcoesVenda()
        {
            rdiTipoTelaVenda.Visible = true;
        }

        private void FormLogin_KeyDown(object sender, KeyEventArgs e)
        {

        }

        private void atualizarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var session = FormularioRepository.GetSession();
            var t = session.BeginTransaction();
            try
            {
                var perfil = session.Get<Perfil>(3); // Obtém o perfil de administrador.
                var usrs = session.CreateCriteria<Usuario>().List<Usuario>(); // Obtém os usuários do sistema.
                if (MessageBox.Show("Adicionar formulário de notas fiscais de entrada.","Atenção!",MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    // Adiciona a permissão para as notas fiscais de entrada.
                    var form = new Formulario()
                    {
                        Nome = "NotaFiscalEntrada"
                    };
                    session.Save(form);
                    
                    perfil.PermissoesFormulario.Add(new PermissaoForm()
                    {
                        Formulario = form,
                        PermissaoAcesso = true,
                        PermissaoDelete = true,
                        PermissaoInsert = true,
                        PermissaoSelect = true,
                        PermissaoUpdate = true
                    });
                    session.Save(perfil);
                    
                    foreach (var usr in usrs)
                    {
                        usr.PermissoesFormulario.Add(new PermissaoForm()
                        {
                            Formulario = form,
                            PermissaoAcesso = false,
                            PermissaoDelete = false,
                            PermissaoInsert = false,
                            PermissaoSelect = false,
                            PermissaoUpdate = false
                        });
                        session.Save(usr);
                    }
                }

                if (MessageBox.Show("Adicionar formulário de terminais.","Atenção!",MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    var formTerminal = new Formulario()
                    {
                        Nome = "ConfTerminal"
                    };
                    session.Save(formTerminal);

                    perfil.PermissoesFormulario.Add(new PermissaoForm()
                    {
                        Formulario = formTerminal,
                        PermissaoAcesso = true,
                        PermissaoDelete = true,
                        PermissaoInsert = true,
                        PermissaoSelect = true,
                        PermissaoUpdate = true
                    });
                    session.Save(perfil);

                    foreach (var usr in usrs)
                    {
                        usr.PermissoesFormulario.Add(new PermissaoForm()
                        {
                            Formulario = formTerminal,
                            PermissaoAcesso = false,
                            PermissaoDelete = false,
                            PermissaoInsert = false,
                            PermissaoSelect = false,
                            PermissaoUpdate = false
                        });
                        session.Save(usr);
                    }
                }
                var cmd = new NpgsqlCommand("update \"NotaFiscal\" set serie = '1', modelo = 0 where serie = 'D1';");
                cmd.Connection = (NpgsqlConnection)session.Connection;
                cmd.ExecuteNonQuery();
                cmd.CommandText = "update \"FormaPagamento\" set podereceber = true;"; cmd.ExecuteNonQuery();

                t.Commit();
            }
            catch (Exception)
            {
                t.Rollback();
                MessageBox.Show("Erro ao atualizar dados no sistema.");
            }

        }

        private void atualizarBancoDeDadosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                var s = FluentNHibernate.Cfg.Fluently
                            .Configure()
                            .Database(PostgreSQLConfiguration.PostgreSQL82.ConnectionString(RepositoryBase<object>._cnnStr))
                            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TipoLancamento>())
                            .ExposeConfiguration(config => new SchemaUpdate(config).Execute(false, true))
                            .BuildSessionFactory().OpenSession();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao atualizar banco de dados.\n" + ex.Message);
            }
        }

        private void iniciarCFOPToolStripMenuItem_Click(object sender, EventArgs e)
        {

            try
            {
                DadosIniciaisCfop.Iniciar();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao iniciar a tabela CFOP.\n" + ex.Message);
            }
        }

        private void iniciarCSTToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var s = CSTRepositorio.GetSession();
            var t = s.BeginTransaction();
            try
            {
                DadosIniciaisCst.Inicio(s);
                t.Commit();
            }
            catch (Exception ex)
            {
                t.Rollback();
                MessageBox.Show("Erro ao iniciar CSTs.\n" + ex.Message);
            }

        }


    }
}